﻿using PhraseCorrector.Common;
using PhraseCorrector.SpellCore;
using System.Collections.Generic;
using System.Linq;


namespace PhraseCorrector.WordLineSplit
{
    internal class EnglishSimilary 
    {

        #region 成员变量

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 英文识别结果，专门用于存储和处理英文的识别数据
        /// </summary>
        private PhraseResult EnglishResult { set; get; } = new PhraseResult();

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 拼音识别结果，用于存储拼音的识别数据，可能用于中文相关的识别处理
        /// </summary>
        private PhraseResult PinyinResult { set; get; } = new PhraseResult();
        #endregion

        #region 调用入口

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 初始化EnglishSimilary类，用于后续的相似度比较。
        /// </summary>
        /// <param name="chineseResult">中文结果对象。</param>
        /// <param name="englishResult">英文结果对象。</param>
        /// <param name="pinyinResult">拼音结果对象。</param>
        public EnglishSimilary(PhraseResult chineseResult, PhraseResult englishResult, PhraseResult pinyinResult)
        {
            EnglishResult = englishResult;
            PinyinResult = pinyinResult;
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 计算给定对象与当前实例在中文、英文和拼音上的相似度。
        /// </summary>
        /// <param name="obj">待比较的对象。</param>
        /// <returns>包含中文、英文和拼音相似度的元组。</returns>
        private List<double> ChineseSmilary_Values(PhraseResult obj) {
            return new List<double>(){
                string.IsNullOrEmpty(EnglishResult.Chinese) ? 0 : SpellCoefficient.Similarity(EnglishResult.Words, obj.Words),
                string.IsNullOrEmpty(PinyinResult.Chinese) ? 0 : SpellCoefficient.Similarity(PinyinResult.Words, obj.Words)
            };
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 设置最相似的结果到给定对象中。
        /// </summary>
        /// <param name="obj">待比较的对象。</param>
        public void SetBetter(PhraseResult obj) {
            var similary = ChineseSmilary_Values(obj);
            SetBetterResukt(obj, similary.IndexOf(similary.Max()), similary);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 根据指定的索引和相似度列表，调整并设置对象的中文属性为更优的结果。
        /// </summary>
        /// <param name="obj">要修改的ECResult对象。</param>
        /// <param name="idx">指定要尝试的语言类型索引。</param>
        /// <param name="similary">包含不同语言类型相似度的列表。</param>
        public void SetBetterResukt(PhraseResult obj, int idx, List<double> similary) {
            if (similary[idx] == 0) return;
            // 根据idx的值选择不同的语言处理方法，如果idx不在预期范围内，则保持obj的Chinese属性不变
            obj.Words = idx switch {
                0 => TryEnglish(obj, idx, similary[idx]),
                1 => TryPinyin(obj, idx, similary[idx]),
                _ => obj.Words
            };
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 尝试根据条件返回英文结果
        /// </summary>
        /// <param name="obj">包含结果信息的对象</param>
        /// <param name="idx">索引位置</param>
        /// <param name="similary">相似度</param>
        /// <returns>根据条件返回相应的中文结果</returns>
        private string TryEnglish(PhraseResult obj, int idx, double similary) {
            // 当索引为0且相似度大于0.3时，返回预设的中文结果；否则，返回对象中的中文结果
            return (EnglishResult.Score > 0 && similary > 0.6)
                ? EnglishResult.Words
                : "";
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 根据相似度条件选择返回拼音或中文
        /// </summary>
        /// <param name="obj">ECResult对象，包含中文信息</param>
        /// <param name="idx">索引位置，用于判断是否为特定项</param>
        /// <param name="similary">相似度值，用于判断是否满足条件</param>
        /// <returns>如果索引为0且相似度大于0.3，则返回拼音；否则返回中文</returns>
        private string TryPinyin(PhraseResult obj, int idx, double similary) {
            // 当idx为0且相似度大于0.3时，认为应该返回拼音
            return (PinyinResult.Score > 0 && similary > 0.6)
                ? PinyinResult.Words
                : "";
        }

        #endregion
    }
}
